package com.birdboot.core;

import com.birdboot.http.HttpServletRequest;
import com.birdboot.http.HttpServletResponse;

import java.io.File;
import java.net.URISyntaxException;

/**
 * V8新增能容:
 * DispatcherServlet是由SpringMVC框架提供的一个Servlet类,用于与Tomcat整合使用的类.
 * 具体作用是接收处理请求的工作
 *
 * 这里我们先将原ClientHandler中处理请求的所有工作移动到这个类的service方法上
 * 注:
 * Tomcat中处理请求的类都需要继承HttpServlet,而实现类都需要重写方法:service,用于处理请求
 * SpringMVC提供的DispatcherServlet实际上也这样做了.我们这里不需要真的去继承了,但是格式上
 * 与其保持一致.
 */
public class DispatcherServlet {
    //V8:单例模式
    private static DispatcherServlet instance = new DispatcherServlet();
    /*
        V8改动:
        由于类加载路径和其下的static目录是固定的,因此表示这两个目录的File对象可以定义成
        静态的,全局一份即可,没必要每次处理请求时都实例化一次.
     */
    private static File baseDir;
    private static File staticDir;
    static{
        try {
            baseDir = new File(
                    DispatcherServlet.class.getClassLoader().getResource(".").toURI()
            );
            staticDir = new File(baseDir,"static");
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }

    private DispatcherServlet(){}

    public void service(HttpServletRequest request, HttpServletResponse response){
        String path = request.getUri();
        System.out.println("抽象路径:"+path);
        //V8改动:原来在这里定义的baseDir和staticDir转移到上面定义成静态的并在静态块初始化
        File file = new File(staticDir,path);
        if(file.isFile()){
            response.setContentFile(file);
        }else{
            file = new File(staticDir,"404.html");
            response.setStatusCode(404);
            response.setStatusReason("NotFound");
            response.setContentFile(file);
        }
    }

    public static DispatcherServlet getInstance(){
        return instance;
    }
}
